package worker;

import java.io.Serializable;
import java.util.ArrayList;

import org.objectweb.proactive.api.PAActiveObject;
import org.objectweb.proactive.api.PAMobileAgent;
import org.objectweb.proactive.core.node.NodeException;

public abstract class MaillonManager implements Serializable {

	private static final long serialVersionUID = -8538687389671585035L;
	
	protected ArrayList<Maillon> maillons;
	protected int nbBackup = 0;
	

	// ----- PROTECTED -----
	
	protected MaillonManager () {
		maillons = new ArrayList<Maillon>();
		nbBackup = 0;
	}

	protected MaillonManager (ArrayList<Maillon> list) {
		maillons = list;
		nbBackup = 0;
	}
	
	protected MaillonManager (int backup) {
		maillons = new ArrayList<Maillon>();
		nbBackup = backup;
	}

	protected MaillonManager (ArrayList<Maillon> list, int backup) {
		maillons = list;
		nbBackup = backup;
	}
	
	
	/**
     * Met a jour un manager dans un maillon.
     * @param manager, free.
     */
	protected void setManager (ManagerImpl m, boolean free) {
		int index = maillons.indexOf(m);
		if (index != -1) setManager(index, free);
	}
	
	
	// ---- PUBLIC ----
	
	/**
     * Met a jour l'etat d'un manager.
     * @param index, free.
     */
	protected void setManager (int index, boolean free) {
		maillons.get(index).setFree(free);
	}
	
	/**
	 * Renvoie le nombre de backups à gerer
	 * @return nbBackup
	 */
	public int getNbBackup() {
		return nbBackup;
	}

	/**
	 * Definit le nombre de backups a gerer
	 * @param nbBackup
	 */
	public void setNbBackup(int nbBackup) {
		this.nbBackup = nbBackup;
	}

	/**
     * Retourne un manager contenu dans un maillon.
     * @return un manager.
     */
	public ArrayList<Maillon> getMaillons () { 
		return maillons; 
	}
	
	/**
     * Fait migre un objet actif manager vers un noeud inoccupe.
     * @param manager.
	 * @throws NodeException 
     */
	public void moveTo(String url) {
	    try {
			if (url.equals(PAActiveObject.getActiveObjectNodeUrl(PAActiveObject.getStubOnThis()))) return;
	        PAMobileAgent.migrateTo(url);
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
	}
	
	/**
     * Cherche un worker dans la liste.
     * @return un manager.
     */
	public int searchWorker (Worker w) {
		int index = 0;
		for ( ; index < maillons.size() && ! w.equals(maillons.get(index).getManager().getWorker()) ; ++index);
		
		return index == maillons.size() ? -1 : index;
	}
}
